抽象工厂【AbstractFactory】

实例

class System{}
class Soft{}

class MacSystem extends System{}
class MacSoft extends Soft{}

class WinSystem extends System{}
class WinSoft extends Soft{}

// 抽象工厂模式
interface AbstractFactory {
    public function CreateSystem();
    public function CreateSoft();
}
// 苹果工厂
class MacFactory implements AbstractFactory {
    public function CreateSystem(){ return new MacSystem(); }
    public function CreateSoft(){ return new MacSoft(); }
}
// windows工厂
class WinFactory implements AbstractFactory {
    public function CreateSystem(){ return new WinSystem(); }
    public function CreateSoft(){ return new WinSoft(); }
}

// 创建MacFactory工厂
$MacFactory = new MacFactory();
// 用MacFactory工厂分别创建不同对象
var_dump($MacFactory->CreateSystem());
var_dump($MacFactory->CreateSoft());

//创建WinFactory
$WinFactory = new WinFactory();
//用WinFactory工厂分别创建不同对象
var_dump($WinFactory->CreateSystem());
var_dump($WinFactory->CreateSoft());

/*
object(MacSystem)#2 (0) { }
object(MacSoft)#2 (0) { }
object(WinSystem)#3 (0) { }
object(WinSoft)#3 (0) { }
*/

总结

所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断代码的耦合。

意图

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

优点

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点

产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景

1、QQ 换皮肤,一整套一起换。
2、生成不同操作系统的程序。

注意事项

产品族难扩展,产品等级易扩展。

应用实例

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口(如衣柜),而无需指定它们的具体类(如商务装或时尚装),保证客户端使用的一整套产品族(如上衣、裤子)是协调一致的。